package be.vdab.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

import be.vdab.entities.Klanten;

public class KlantenDAO {
	private static final String ZOEK_KLANT = "select * from klanten where GebruikersNaam =? and Paswoord=?";
	private static final String ZOEK_KLANTopNUMMER = "select * from klanten where klantNr=?";
	private static final String ZOEK_KLANTEN = "Select * from klanten order by klantnr";
	private static final String NIEUWE_KLANT = "Insert into klanten values (?,?,?,?,?,?,?,?,?)";
	private static final String ZOEK_GEBRUIKERSNAAM = "select gebruikersnaam from klanten";
	private final DatabaseUtil databaseUtil = new DatabaseUtil();

	public Klanten zoekGebruiker(String gebruikersnaam, String paswoord) {
		Connection connection = null;
		ResultSet resultSet = null;
		PreparedStatement statement = null;
		try {
			Klanten klant = null;
			connection = databaseUtil.getConnection();
			statement = connection.prepareStatement(ZOEK_KLANT);
			statement.setString(1, gebruikersnaam);
			statement.setString(2, paswoord);
			resultSet = statement.executeQuery();
			if (resultSet.next()) {
				klant = resultSetRijNaarKlanten(resultSet);
			}
			return klant;
		} catch (SQLException ex) {
			throw new DAOException("kan klant niet lezen uit de database" + ex);
		} finally {
			databaseUtil.close(resultSet, statement, connection);
		}
	}
	
	public Klanten zoekGebruiker(Long nummer) {
		Connection connection = null;
		ResultSet resultSet = null;
		PreparedStatement statement = null;
		try {
			Klanten klant = null;
			connection = databaseUtil.getConnection();
			statement = connection.prepareStatement(ZOEK_KLANTopNUMMER);
			statement.setLong(1, nummer);
			resultSet = statement.executeQuery();
			if (resultSet.next()) {
				klant = resultSetRijNaarKlanten(resultSet);
			}
			return klant;
		} catch (SQLException ex) {
			throw new DAOException("kan klant niet lezen uit de database" + ex);
		} finally {
			databaseUtil.close(resultSet, statement, connection);
		}
	}

	public Long getNummer() {
		Connection connection = null;
		ResultSet resultSet = null;
		java.sql.Statement statement = null;
		try {
			Long nummer = null;
			connection = databaseUtil.getConnection();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(ZOEK_KLANTEN);
			if (resultSet.next()) {
				resultSet.last();
				nummer = resultSetRijNaarNummer(resultSet);
			}
			return nummer;
		} catch (SQLException ex) {
			throw new DAOException("kan klant niet lezen uit de database" + ex);
		} finally {
			databaseUtil.close(resultSet, statement, connection);
		}
	}

	public void voegKlantToe(Klanten klant) {
		Connection connection = null;
		PreparedStatement statement = null;
		try {
			connection = databaseUtil.getConnection();
			statement = connection.prepareStatement(NIEUWE_KLANT);
			statement.setLong(1, klant.getKlantNr());
			statement.setString(2, klant.getVoornaam());
			statement.setString(3, klant.getFamilienaam());
			statement.setString(4, klant.getStraat());
			statement.setLong(5, klant.getHuisNr());
			statement.setLong(6, klant.getPostcode());
			statement.setString(7, klant.getGemeente());
			statement.setString(8, klant.getGebruikersnaam());
			statement.setString(9, klant.getPaswoord());
			statement.executeUpdate();
		} catch (SQLException ex) {
			throw new DAOException("kan nieuwe klant niet invoeren" + ex);
		} finally {
			databaseUtil.close(statement, connection);
		}
	}

	public List<String> getGebruikersnamen() {
		Connection connection = null;
		ResultSet resultSet = null;
		java.sql.Statement statement = null;
		try {
			List<String> gebruikersnamen = new ArrayList<String>();
			connection = databaseUtil.getConnection();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(ZOEK_GEBRUIKERSNAAM);
			while (resultSet.next()) {
				gebruikersnamen.add(resultSetGebruikersnaam(resultSet));
			}
			return gebruikersnamen;
		} catch (SQLException ex) {
			throw new DAOException("kan lijst gebruikersnamen niet maken" + ex);
		} finally {
			databaseUtil.close(resultSet, statement, connection);
		}
	}

	private String resultSetGebruikersnaam(ResultSet resultSet)
			throws SQLException {
		return resultSet.getString(1);
	}

	private Long resultSetRijNaarNummer(ResultSet resultSet)
			throws SQLException {
		return resultSet.getLong("Klantnr");
	}

	private Klanten resultSetRijNaarKlanten(ResultSet resultSet)
			throws SQLException {
		return new Klanten(resultSet.getLong("Klantnr"),
				resultSet.getString("voornaam"),
				resultSet.getString("familienaam"),
				resultSet.getString("straat"), resultSet.getLong("huisnr"),
				resultSet.getLong("postcode"), resultSet.getString("gemeente"),
				resultSet.getString("gebruikersnaam"),
				resultSet.getString("paswoord"));
	}

}
